package com.eeds.num;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * @author revelin
 * @date 下午3:48 18-5-14
 **/
public class BigDecimalUtil {

    /**
     * 提供精确加法计算的add方法
     * @param value1 被加数
     * @param value2 加数
     * @return 两个参数的和
     */
    public static BigDecimal add(String value1,String value2){
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        return b1.add(b2);
    }

    /**
     * 提供精确减法运算的sub方法
     * @param value1 被减数
     * @param value2 减数
     * @return 两个参数的差
     */
    public static BigDecimal sub(String value1,String value2){
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        return b1.subtract(b2);
    }
    public static BigDecimal sub(BigDecimal value1,BigDecimal value2){
        return value1.subtract(value2);
    }


    /**
     * 提供精确乘法运算的mul方法
     * @param value1 被乘数
     * @param value2 乘数
     * @return 两个参数的积
     */
    public static BigDecimal mul(String value1,String value2){
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        return b1.multiply(b2);
    }

    /**
     * 提供精确乘法运算的mul方法
     * @param value1 被乘数
     * @param value2 乘数
     * @return 两个参数的积
     */
    public static BigDecimal mul(BigDecimal value1, BigDecimal value2){
        return value1.multiply(value2);
    }

    /**
     * 提供保留两位小数乘法运算的mul方法
     * @param value1 被乘数
     * @param value2 乘数
     * @return 两个参数的积
     */
    public static BigDecimal mul2(BigDecimal value1, BigDecimal value2){
        return value1.multiply(value2).setScale(2, BigDecimal.ROUND_DOWN);
    }

    /**
     * description: 获得数字0
     *
     * @author: leiming
     * @date: 2018/9/4 13:31
     * @param:
     * @return:
     */
    public static BigDecimal ZERO(){
        return BigDecimal.ZERO;
    }

    /**
     * 提供精确的除法运算方法div
     * @param value1 被除数
     * @param value2 除数
     * @param scale 精确范围
     * @return 两个参数的商
     * @throws IllegalAccessException
     */
    public static BigDecimal div(String value1,String value2,Integer scale){
        //如果精确范围小于0，抛出异常信息
        if(scale == null || scale<0 ){
            scale = 2;
        }
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        return b1.divide(b2, scale);
    }

    /**
     * @author: revelin
     * @param null
     * @Date:  下午3:50 18-5-14
     * @Description: 四舍五入后保留2位小数的值
     *
     **/
    public static double getRoundHalfUpDouble(String doubleString) {
        try {
            BigDecimal b = new BigDecimal(doubleString);
            return b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        } catch (Exception e) {
            return 0.0;
        }
    }

    /**
     * @author: revelin
     * @param null
     * @Date:  下午3:50 18-5-14
     * @Description: 四舍五入后保留2位小数的值
     *
     **/
    public static BigDecimal getRoundHalfUp(String doubleString) {
        try {
            BigDecimal b = new BigDecimal(doubleString);
            return b.setScale(2, BigDecimal.ROUND_HALF_UP);
        } catch (Exception e) {
            return new BigDecimal("0.0");
        }
    }


    /**
     * @author: revelin
     * @Param
     * @Date:  下午9:10 18-5-22
     * @Description: 分转元
     *
     **/
    public static BigDecimal div(String amount) {

        try{
            Long.parseLong(amount);
        }catch(Exception e){
            throw new RuntimeException(e);
        }
        return BigDecimal.valueOf(Long.valueOf(amount)).divide(new BigDecimal(100));
    }

    /**
     * @author: revelin
     * @Param
     * @Date:  下午9:10 18-5-22
     * @Description: 元转分
     *
     **/
    public static String multi(String amount) {
        return multi(amount,100).intValue() + "";
    }

    /**
     * @author: revelin
     * @Param
     * @Date:  下午9:10 18-5-22
     * @Description: 元转分
     *
     **/
    public static BigDecimal multi(String amount, Integer mult) {
        if(amount == null){
            throw new RuntimeException("金额转换异常，传入的金额为null");
        }
        BigDecimal b = new BigDecimal(amount);
        return b.multiply(new BigDecimal(mult));
    }

    public static int compare(String value1,String value2){
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        return b1.compareTo(b2);
    }

    /**
     * 转换成金额科学计数法金额
     * @param bigDecimal
     * @return
     */
    public static String getStringMoney(BigDecimal bigDecimal){
        NumberFormat nf = new DecimalFormat("###,###,###,##0.00");
        return nf.format(bigDecimal);
    }

    public static String formatString(BigDecimal bigDecimal){
        NumberFormat nf =  new DecimalFormat("0.00");
        return nf.format(bigDecimal);
    }

    public static void main(String[] args) {

//        System.out.println(compare("16","15"));

//        System.out.println(new BigDecimal("1.55")
//                .setScale(1, BigDecimal.ROUND_HALF_UP));

        System.out.println(BigDecimalUtil.formatString(new BigDecimal("123.321")));
        System.out.println(BigDecimalUtil.formatString(new BigDecimal("123.328")));
    }
}
